// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_AURA_CLIENT_FOCUS_CLIENT_H_
#define UI_AURA_CLIENT_FOCUS_CLIENT_H_

#include "ui/aura/aura_export.h"

namespace ui {
class Event;
}

namespace aura {
class Window;
namespace client {
    class FocusChangeObserver;

    // An interface implemented by an object that manages window focus.
    class AURA_EXPORT FocusClient {
    public:
        virtual ~FocusClient() { }

        virtual void AddObserver(FocusChangeObserver* observer) = 0;
        virtual void RemoveObserver(FocusChangeObserver* observer) = 0;

        // Focuses |window|. Passing NULL clears focus.
        virtual void FocusWindow(Window* window) = 0;

        // Sets focus to |window| if it's within the active window. Not intended as a
        // general purpose API, use FocusWindow() instead.
        virtual void ResetFocusWithinActiveWindow(Window* window) = 0;

        // Retrieves the focused window, or NULL if there is none.
        virtual Window* GetFocusedWindow() = 0;
    };

    // Sets/Gets the focus client on the root Window.
    AURA_EXPORT void SetFocusClient(Window* root_window, FocusClient* client);
    AURA_EXPORT FocusClient* GetFocusClient(Window* window);
    AURA_EXPORT FocusClient* GetFocusClient(const Window* window);

} // namespace clients
} // namespace aura

#endif // UI_AURA_CLIENT_FOCUS_CLIENT_H_
